Skip to content

Commit a9f64e1

Browse files
Vidya Sagargregkh
authored andcommitted
PCI: tegra194: Don't force the device into the D0 state before L2
[ Upstream commit 71d9f67 ] As per PCIe CEM r6.0, sec 2.3, the PCIe Endpoint device should be in D3cold to assert WAKE# pin. The previous workaround that forced downstream devices to D0 before taking the link to L2 cited PCIe r4.0, sec 5.2, "Link State Power Management"; however, that spec does not explicitly require putting the device into D0 and only indicates that power removal may be initiated without transitioning to D3hot. Remove the D0 workaround so that Endpoint devices can use wake functionality (WAKE# from D3). With some Endpoints the link may not enter L2 when they remain in D3, but the Root Port continues with the usual flow after PME timeout, so there is no functional issue. Fixes: 56e15a2 ("PCI: tegra: Add Tegra194 PCIe support") Signed-off-by: Vidya Sagar <vidyas@nvidia.com> Signed-off-by: Manikanta Maddireddy <mmaddireddy@nvidia.com> Signed-off-by: Manivannan Sadhasivam <mani@kernel.org> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Reviewed-by: Vidya Sagar <vidyas@nvidia.com> Reviewed-by: Jon Hunter <jonathanh@nvidia.com> Link: https://patch.msgid.link/20260324190755.1094879-5-mmaddireddy@nvidia.com Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 144ce5d commit a9f64e1

1 file changed

Lines changed: 0 additions & 41 deletions

File tree

drivers/pci/controller/dwc/pcie-tegra194.c

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,44 +1258,6 @@ static int tegra_pcie_bpmp_set_pll_state(struct tegra_pcie_dw *pcie,
12581258
return 0;
12591259
}
12601260

1261-
static void tegra_pcie_downstream_dev_to_D0(struct tegra_pcie_dw *pcie)
1262-
{
1263-
struct dw_pcie_rp *pp = &pcie->pci.pp;
1264-
struct pci_bus *child, *root_port_bus = NULL;
1265-
struct pci_dev *pdev;
1266-
1267-
/*
1268-
* link doesn't go into L2 state with some of the endpoints with Tegra
1269-
* if they are not in D0 state. So, need to make sure that immediate
1270-
* downstream devices are in D0 state before sending PME_TurnOff to put
1271-
* link into L2 state.
1272-
* This is as per PCI Express Base r4.0 v1.0 September 27-2017,
1273-
* 5.2 Link State Power Management (Page #428).
1274-
*/
1275-
1276-
list_for_each_entry(child, &pp->bridge->bus->children, node) {
1277-
if (child->parent == pp->bridge->bus) {
1278-
root_port_bus = child;
1279-
break;
1280-
}
1281-
}
1282-
1283-
if (!root_port_bus) {
1284-
dev_err(pcie->dev, "Failed to find downstream bus of Root Port\n");
1285-
return;
1286-
}
1287-
1288-
/* Bring downstream devices to D0 if they are not already in */
1289-
list_for_each_entry(pdev, &root_port_bus->devices, bus_list) {
1290-
if (PCI_SLOT(pdev->devfn) == 0) {
1291-
if (pci_set_power_state(pdev, PCI_D0))
1292-
dev_err(pcie->dev,
1293-
"Failed to transition %s to D0 state\n",
1294-
dev_name(&pdev->dev));
1295-
}
1296-
}
1297-
}
1298-
12991261
static int tegra_pcie_get_slot_regulators(struct tegra_pcie_dw *pcie)
13001262
{
13011263
pcie->slot_ctl_3v3 = devm_regulator_get_optional(pcie->dev, "vpcie3v3");
@@ -1625,7 +1587,6 @@ static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie)
16251587

16261588
static void tegra_pcie_deinit_controller(struct tegra_pcie_dw *pcie)
16271589
{
1628-
tegra_pcie_downstream_dev_to_D0(pcie);
16291590
dw_pcie_host_deinit(&pcie->pci.pp);
16301591
tegra_pcie_dw_pme_turnoff(pcie);
16311592
tegra_pcie_unconfig_controller(pcie);
@@ -2336,7 +2297,6 @@ static int tegra_pcie_dw_suspend_noirq(struct device *dev)
23362297
if (!pcie->link_state)
23372298
return 0;
23382299

2339-
tegra_pcie_downstream_dev_to_D0(pcie);
23402300
tegra_pcie_dw_pme_turnoff(pcie);
23412301
tegra_pcie_unconfig_controller(pcie);
23422302

@@ -2410,7 +2370,6 @@ static void tegra_pcie_dw_shutdown(struct platform_device *pdev)
24102370
return;
24112371

24122372
debugfs_remove_recursive(pcie->debugfs);
2413-
tegra_pcie_downstream_dev_to_D0(pcie);
24142373

24152374
disable_irq(pcie->pci.pp.irq);
24162375
if (IS_ENABLED(CONFIG_PCI_MSI))

0 commit comments

Comments
 (0)