Skip to content

Commit 4decfbd

Browse files
committed
Merge: PCI: Explicitly put devices into D0 when initializing
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/1257 ``` JIRA: https://issues.redhat.com/browse/RHEL-90801 Upstream Status: 4d4c10f - Set all devices to D0 during enumeration to ensure ACPI opregion is connected via _REG (Mario Limonciello) - Set up runtime PM even for devices that lack a PM Capability as we did before 4d4c10f ("PCI: Explicitly put devices into D0 when initializing"), which broke resume in some VFIO scenarios (Mario Limonciello) * pci/pm: PCI: Explicitly put devices into D0 when initializing PCI/PM: Set up runtime PM even for devices without PCI PM Signed-off-by: Myron Stowe <mstowe@redhat.com> ``` Approved-by: John W. Linville <linville@redhat.com> Approved-by: Steve Best <sbest@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Julio Faracco <jfaracco@redhat.com>
2 parents c530e3d + d2664a9 commit 4decfbd

File tree

3 files changed

+14
-11
lines changed

3 files changed

+14
-11
lines changed

drivers/pci/pci-driver.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -564,12 +564,6 @@ static void pci_pm_default_resume(struct pci_dev *pci_dev)
564564
pci_enable_wake(pci_dev, PCI_D0, false);
565565
}
566566

567-
static void pci_pm_power_up_and_verify_state(struct pci_dev *pci_dev)
568-
{
569-
pci_power_up(pci_dev);
570-
pci_update_current_state(pci_dev, PCI_D0);
571-
}
572-
573567
static void pci_pm_default_resume_early(struct pci_dev *pci_dev)
574568
{
575569
pci_pm_power_up_and_verify_state(pci_dev);

drivers/pci/pci.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3192,6 +3192,12 @@ void pci_d3cold_disable(struct pci_dev *dev)
31923192
}
31933193
EXPORT_SYMBOL_GPL(pci_d3cold_disable);
31943194

3195+
void pci_pm_power_up_and_verify_state(struct pci_dev *pci_dev)
3196+
{
3197+
pci_power_up(pci_dev);
3198+
pci_update_current_state(pci_dev, PCI_D0);
3199+
}
3200+
31953201
/**
31963202
* pci_pm_init - Initialize PM functions of given PCI device
31973203
* @dev: PCI device to handle.
@@ -3202,9 +3208,6 @@ void pci_pm_init(struct pci_dev *dev)
32023208
u16 status;
32033209
u16 pmc;
32043210

3205-
pm_runtime_forbid(&dev->dev);
3206-
pm_runtime_set_active(&dev->dev);
3207-
pm_runtime_enable(&dev->dev);
32083211
device_enable_async_suspend(&dev->dev);
32093212
dev->wakeup_prepared = false;
32103213

@@ -3214,14 +3217,14 @@ void pci_pm_init(struct pci_dev *dev)
32143217
/* find PCI PM capability in list */
32153218
pm = pci_find_capability(dev, PCI_CAP_ID_PM);
32163219
if (!pm)
3217-
return;
3220+
goto poweron;
32183221
/* Check device's ability to generate PME# */
32193222
pci_read_config_word(dev, pm + PCI_PM_PMC, &pmc);
32203223

32213224
if ((pmc & PCI_PM_CAP_VER_MASK) > 3) {
32223225
pci_err(dev, "unsupported PM cap regs version (%u)\n",
32233226
pmc & PCI_PM_CAP_VER_MASK);
3224-
return;
3227+
goto poweron;
32253228
}
32263229

32273230
dev->pm_cap = pm;
@@ -3266,6 +3269,11 @@ void pci_pm_init(struct pci_dev *dev)
32663269
pci_read_config_word(dev, PCI_STATUS, &status);
32673270
if (status & PCI_STATUS_IMM_READY)
32683271
dev->imm_ready = 1;
3272+
poweron:
3273+
pci_pm_power_up_and_verify_state(dev);
3274+
pm_runtime_forbid(&dev->dev);
3275+
pm_runtime_set_active(&dev->dev);
3276+
pm_runtime_enable(&dev->dev);
32693277
}
32703278

32713279
static unsigned long pci_ea_flags(struct pci_dev *dev, u8 prop)

drivers/pci/pci.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ void pci_dev_adjust_pme(struct pci_dev *dev);
148148
void pci_dev_complete_resume(struct pci_dev *pci_dev);
149149
void pci_config_pm_runtime_get(struct pci_dev *dev);
150150
void pci_config_pm_runtime_put(struct pci_dev *dev);
151+
void pci_pm_power_up_and_verify_state(struct pci_dev *pci_dev);
151152
void pci_pm_init(struct pci_dev *dev);
152153
void pci_ea_init(struct pci_dev *dev);
153154
void pci_msi_init(struct pci_dev *dev);

0 commit comments

Comments
 (0)