Patch "PCI: tegra194: Move controller cleanups to pex_ep_event_pex_rst_deassert()" has been added to the 6.11-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    PCI: tegra194: Move controller cleanups to pex_ep_event_pex_rst_deassert()

to the 6.11-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     pci-tegra194-move-controller-cleanups-to-pex_ep_even.patch
and it can be found in the queue-6.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 9be590f9ab45871a22b5962ecc3a05150ce33d19
Author: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx>
Date:   Sat Aug 17 11:09:04 2024 +0530

    PCI: tegra194: Move controller cleanups to pex_ep_event_pex_rst_deassert()
    
    [ Upstream commit 40e2125381dc11379112485e3eefdd25c6df5375 ]
    
    Currently, the endpoint cleanup function dw_pcie_ep_cleanup() and EPF
    deinit notify function pci_epc_deinit_notify() are called during the
    execution of pex_ep_event_pex_rst_assert() i.e., when the host has asserted
    PERST#. But quickly after this step, refclk will also be disabled by the
    host.
    
    All of the tegra194 endpoint SoCs supported as of now depend on the refclk
    from the host for keeping the controller operational. Due to this
    limitation, any access to the hardware registers in the absence of refclk
    will result in a whole endpoint crash. Unfortunately, most of the
    controller cleanups require accessing the hardware registers (like eDMA
    cleanup performed in dw_pcie_ep_cleanup(), etc...). So these cleanup
    functions can cause the crash in the endpoint SoC once host asserts PERST#.
    
    One way to address this issue is by generating the refclk in the endpoint
    itself and not depending on the host. But that is not always possible as
    some of the endpoint designs do require the endpoint to consume refclk from
    the host.
    
    Thus, fix this crash by moving the controller cleanups to the start of
    the pex_ep_event_pex_rst_deassert() function. This function is called
    whenever the host has deasserted PERST# and it is guaranteed that the
    refclk would be active at this point. So at the start of this function
    (after enabling resources) the controller cleanup can be performed. Once
    finished, rest of the code execution for PERST# deassert can continue as
    usual.
    
    Fixes: 473b2cf9c4d1 ("PCI: endpoint: Introduce 'epc_deinit' event and notify the EPF drivers")
    Fixes: 570d7715eed8 ("PCI: dwc: ep: Introduce dw_pcie_ep_cleanup() API for drivers supporting PERST#")
    Link: https://lore.kernel.org/r/20240817-pci-qcom-ep-cleanup-v1-2-d6b958226559@xxxxxxxxxx
    Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx>
    Signed-off-by: Krzysztof Wilczyński <kwilczynski@xxxxxxxxxx>
    Cc: Jonathan Hunter <jonathanh@xxxxxxxxxx>
    Cc: Thierry Reding <thierry.reding@xxxxxxxxx>
    Cc: Vidya Sagar <vidyas@xxxxxxxxxx>
    Cc: linux-tegra@xxxxxxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c
index 4bf7b433417a3..d68dd18ed43cb 100644
--- a/drivers/pci/controller/dwc/pcie-tegra194.c
+++ b/drivers/pci/controller/dwc/pcie-tegra194.c
@@ -1709,9 +1709,6 @@ static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie)
 	if (ret)
 		dev_err(pcie->dev, "Failed to go Detect state: %d\n", ret);
 
-	pci_epc_deinit_notify(pcie->pci.ep.epc);
-	dw_pcie_ep_cleanup(&pcie->pci.ep);
-
 	reset_control_assert(pcie->core_rst);
 
 	tegra_pcie_disable_phy(pcie);
@@ -1790,6 +1787,10 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie)
 		goto fail_phy;
 	}
 
+	/* Perform cleanup that requires refclk */
+	pci_epc_deinit_notify(pcie->pci.ep.epc);
+	dw_pcie_ep_cleanup(&pcie->pci.ep);
+
 	/* Clear any stale interrupt statuses */
 	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L0);
 	appl_writel(pcie, 0xFFFFFFFF, APPL_INTR_STATUS_L1_0_0);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux