]> www.infradead.org Git - users/hch/misc.git/commitdiff
PCI: rcar-gen4: Assure reset occurs before DBI access
authorMarek Vasut <marek.vasut+renesas@mailbox.org>
Wed, 24 Sep 2025 00:55:45 +0000 (02:55 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 25 Sep 2025 22:50:26 +0000 (17:50 -0500)
Assure the reset is latched and the core is ready for DBI access. On R-Car
V4H, the PCIe reset is asynchronous and does not take effect immediately,
but needs a short time to complete. In case DBI access happens in that
short time, that access generates an SError. Make sure that condition can
never happen, read back the state of the reset, which should turn the
asynchronous reset into a synchronous one, and wait a little over 1ms to
add additional safety margin.

Fixes: 0d0c551011df ("PCI: rcar-gen4: Add R-Car Gen4 PCIe controller support for host mode")
Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://patch.msgid.link/20250924005610.96484-1-marek.vasut+renesas@mailbox.org
drivers/pci/controller/dwc/pcie-rcar-gen4.c

index f996e96be1d704c9621e4ad494ade41793be3025..cc03dd421de8bee9e8bcc4332932ee6bc095a993 100644 (file)
@@ -213,6 +213,19 @@ static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar)
        if (ret)
                goto err_unprepare;
 
+       /*
+        * Assure the reset is latched and the core is ready for DBI access.
+        * On R-Car V4H, the PCIe reset is asynchronous and does not take
+        * effect immediately, but needs a short time to complete. In case
+        * DBI access happens in that short time, that access generates an
+        * SError. To make sure that condition can never happen, read back the
+        * state of the reset, which should turn the asynchronous reset into
+        * synchronous one, and wait a little over 1ms to add additional
+        * safety margin.
+        */
+       reset_control_status(dw->core_rsts[DW_PCIE_PWR_RST].rstc);
+       fsleep(1000);
+
        if (rcar->drvdata->additional_common_init)
                rcar->drvdata->additional_common_init(rcar);