Re: [PATCH 3/3] PCI: tegra194: Notify Endpoint functions on PERST# assert

From: Manikanta Maddireddy

Date: Mon Oct 19 2026 - 07:25:17 EST




On 17/10/26 2:52 pm, Manivannan Sadhasivam wrote:
On Wed, Sep 23, 2026 at 12:55:54PM +0530, Manikanta Maddireddy wrote:
Tegra Endpoint mode powers the controller down when the host asserts
PERST#. EPF drivers must be told about link down before that happens,
otherwise remove while PERST# is asserted can free EPC resources while
EPF work is still active.

Use pci_epc_linkdown() directly in the PERST# assert path. It is a
software-only EPF notification

Not entirely true. The EPF drivers can still access the hardware registers in
the link_down() callback. But most likely they won't access any DBI registers,
so that access may still be OK without REFCLK.

Agreed, “software-only” is too strong. The direct notification avoids the DWC helper’s DBI accesses, but EPF callbacks still need auditing for operation without REFCLK. I’ll correct that wording and remove both the unrelated deinit paragraph and pointer cleanup.

- Manikanta>
and avoids dw_pcie_ep_linkdown(), which
reinitializes non-sticky DWC registers and touches DBI while the host
REFCLK may be disappearing.

Keep pci_epc_deinit_notify() in the PERST# deassert path, after core
reset is deasserted, because EPF deinit callbacks can clear BARs and
therefore need register access. If remove runs while the controller is
already powered down, pex_ep_event_pex_rst_assert() returns because
ep_state is disabled; that is safe because the link-down notification
was sent at the earlier PERST# assert.

The final dw_pcie_ep_deinit() does not require Tegra register access
today: Tegra uses its own MSI-X address-match window instead of the
DWC MSI iATU, and the supported DTs do not register a DWC eDMA device.


Is the last paragraph related to this patch?

Signed-off-by: Manikanta Maddireddy <mmaddireddy@xxxxxxxxxx>
---
drivers/pci/controller/dwc/pcie-tegra194.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c
index dd3f4c30ba52..3e9d46850a78 100644
--- a/drivers/pci/controller/dwc/pcie-tegra194.c
+++ b/drivers/pci/controller/dwc/pcie-tegra194.c
@@ -1724,6 +1724,7 @@ static int tegra_pcie_config_rp(struct tegra_pcie_dw *pcie)
static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie)
{
+ struct dw_pcie_ep *ep = &pcie->pci.ep;
u32 val;
int ret;
@@ -1745,6 +1746,8 @@ static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie)
if (ret)
dev_info(pcie->dev, "LTSSM state: 0x%x detect timeout: %d\n", val, ret);
+ pci_epc_linkdown(ep->epc);
+
/*
* Deassert LTSSM state to stop the state toggling between
* Polling and Detect.
@@ -1913,7 +1916,7 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie)
}
/* Perform cleanup that requires refclk and core reset deasserted */
- pci_epc_deinit_notify(pcie->pci.ep.epc);
+ pci_epc_deinit_notify(ep->epc);

Unrelated change.

- Mani


--
nvpublic