[PATCH v2] PCI: Set up runtime PM on devices that don't support PCI PM

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

 



From: Mario Limonciello <mario.limonciello@xxxxxxx>

commit 4d4c10f763d7 ("PCI: Explicitly put devices into D0 when
initializing") intended to put PCI devices into D0, but in doing so
unintentionally changed runtime PM initialization not to occur on
devices that don't support PCI PM.  This caused a regression in vfio-pci
due to an imbalance with it's use.

Adjust the logic in pci_pm_init() so that even if PCI PM isn't supported
runtime PM is still initialized.

Cc: Alex Williamson <alex.williamson@xxxxxxxxxx>
Reported-by: Giovanni Cabiddu <giovanni.cabiddu@xxxxxxxxx>
Closes: https://lore.kernel.org/linux-pci/20250424043232.1848107-1-superm1@xxxxxxxxxx/T/#m7e8929d6421690dc8bd6dc639d86c2b4db27cbc4
Reported-by: Nicolas Dichtel <nicolas.dichtel@xxxxxxxxx>
Closes: https://lore.kernel.org/linux-pci/20250424043232.1848107-1-superm1@xxxxxxxxxx/T/#m40d277dcdb9be64a1609a82412d1aa906263e201
Tested-by: Giovanni Cabiddu <giovanni.cabiddu@xxxxxxxxx>
Fixes: 4d4c10f763d7 ("PCI: Explicitly put devices into D0 when initializing")
Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>
---
v2:
 * remove pointless return
---
 drivers/pci/pci.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 3dd44d1ad829b..160a9a482c732 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -3222,14 +3222,14 @@ void pci_pm_init(struct pci_dev *dev)
 	/* find PCI PM capability in list */
 	pm = pci_find_capability(dev, PCI_CAP_ID_PM);
 	if (!pm)
-		return;
+		goto poweron;
 	/* Check device's ability to generate PME# */
 	pci_read_config_word(dev, pm + PCI_PM_PMC, &pmc);
 
 	if ((pmc & PCI_PM_CAP_VER_MASK) > 3) {
 		pci_err(dev, "unsupported PM cap regs version (%u)\n",
 			pmc & PCI_PM_CAP_VER_MASK);
-		return;
+		goto poweron;
 	}
 
 	dev->pm_cap = pm;
@@ -3274,6 +3274,7 @@ void pci_pm_init(struct pci_dev *dev)
 	pci_read_config_word(dev, PCI_STATUS, &status);
 	if (status & PCI_STATUS_IMM_READY)
 		dev->imm_ready = 1;
+poweron:
 	pci_pm_power_up_and_verify_state(dev);
 	pm_runtime_forbid(&dev->dev);
 	pm_runtime_set_active(&dev->dev);
-- 
2.43.0





[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux