mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 16:10:56 +07:00
Power management fix for 5.2-rc7
Avoid skipping bus-level PCI power management during system resume for PCIe ports left in D0 during the preceding suspend transition on platforms where the power states of those ports can change out of the PCI layer's control. -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAl0XJzcSHHJqd0Byand5 c29ja2kubmV0AAoJEILEb/54YlRxylwQAI8owd3eQV6UNDybkT5MiP0lWb9nbl83 2ouxla+FtAzRFJC0yW4RK86cW4i/Yl8767KV2yqX/69ftmz4XhZBJ63ijKAEoG6o tHFyY7twy7Sr0MvPRD9rtjUkmdOx9z0OFKHgLhSzC/V4PvgGZTt+eYBm1Bp3icZp ZY9CFx/bSt9tURY//VqXhvBWT6pEpn1B1D7hsiAp041EwhtTONNs7xAa7ucIP+aG Ufyb0waVYmiFCX+Lrt/gHzEO2YIpTHIUw3DaMcbR8plHc1gpYtbuZ2ZMScgt2TgL f0s7GeMOXtF3sODOd/1mhg127ShWbqUkf8EHDyU3JAWa9aesLr3BoFGtKyAT1rbg O9nyJGBGj5ByUNefua0S8+q0kWI2XHdLAQ8CHBlBQx5W1x1Yg2EeV2Kosxjuhfdp 5K9wFIiPG0F/rtGoAA61dMH9tt87NnY8PgeCyHLFUCoJbhySWr18kwrwrdkimqa5 9FR8OTa8CHGQ/0bPvw+w8S9FdxiEM6yw4wuMLIy3c+a22+lgIiPvkgqzdsWYULdX CrI62jvz5SvoTwK/UEp9PrCnnHbp4crbSp73Vgo1o1bi5eeaaSobRECq+IbN0T3P X1H/xn+18mUqmCg4WtDX++14Fe1rMHoe/5CqqE/mp8aCqE9q/3fbAs9INnWJcyrP a2O0Wk0jLE76 =eGQi -----END PGP SIGNATURE----- Merge tag 'pm-5.2-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull power management fix from Rafael Wysocki: "Avoid skipping bus-level PCI power management during system resume for PCIe ports left in D0 during the preceding suspend transition on platforms where the power states of those ports can change out of the PCI layer's control" * tag 'pm-5.2-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: PCI: PM: Avoid skipping bus-level PM on platforms without ACPI
This commit is contained in:
commit
2407e48606
@ -859,7 +859,7 @@ static int pci_pm_suspend_noirq(struct device *dev)
|
||||
pci_dev->bus->self->skip_bus_pm = true;
|
||||
}
|
||||
|
||||
if (pci_dev->skip_bus_pm && !pm_suspend_via_firmware()) {
|
||||
if (pci_dev->skip_bus_pm && pm_suspend_no_platform()) {
|
||||
dev_dbg(dev, "PCI PM: Skipped\n");
|
||||
goto Fixup;
|
||||
}
|
||||
@ -914,10 +914,10 @@ static int pci_pm_resume_noirq(struct device *dev)
|
||||
/*
|
||||
* In the suspend-to-idle case, devices left in D0 during suspend will
|
||||
* stay in D0, so it is not necessary to restore or update their
|
||||
* configuration here and attempting to put them into D0 again may
|
||||
* confuse some firmware, so avoid doing that.
|
||||
* configuration here and attempting to put them into D0 again is
|
||||
* pointless, so avoid doing that.
|
||||
*/
|
||||
if (!pci_dev->skip_bus_pm || pm_suspend_via_firmware())
|
||||
if (!(pci_dev->skip_bus_pm && pm_suspend_no_platform()))
|
||||
pci_pm_default_resume_early(pci_dev);
|
||||
|
||||
pci_fixup_device(pci_fixup_resume_early, pci_dev);
|
||||
|
@ -209,8 +209,9 @@ extern int suspend_valid_only_mem(suspend_state_t state);
|
||||
|
||||
extern unsigned int pm_suspend_global_flags;
|
||||
|
||||
#define PM_SUSPEND_FLAG_FW_SUSPEND (1 << 0)
|
||||
#define PM_SUSPEND_FLAG_FW_RESUME (1 << 1)
|
||||
#define PM_SUSPEND_FLAG_FW_SUSPEND BIT(0)
|
||||
#define PM_SUSPEND_FLAG_FW_RESUME BIT(1)
|
||||
#define PM_SUSPEND_FLAG_NO_PLATFORM BIT(2)
|
||||
|
||||
static inline void pm_suspend_clear_flags(void)
|
||||
{
|
||||
@ -227,6 +228,11 @@ static inline void pm_set_resume_via_firmware(void)
|
||||
pm_suspend_global_flags |= PM_SUSPEND_FLAG_FW_RESUME;
|
||||
}
|
||||
|
||||
static inline void pm_set_suspend_no_platform(void)
|
||||
{
|
||||
pm_suspend_global_flags |= PM_SUSPEND_FLAG_NO_PLATFORM;
|
||||
}
|
||||
|
||||
/**
|
||||
* pm_suspend_via_firmware - Check if platform firmware will suspend the system.
|
||||
*
|
||||
@ -268,6 +274,22 @@ static inline bool pm_resume_via_firmware(void)
|
||||
return !!(pm_suspend_global_flags & PM_SUSPEND_FLAG_FW_RESUME);
|
||||
}
|
||||
|
||||
/**
|
||||
* pm_suspend_no_platform - Check if platform may change device power states.
|
||||
*
|
||||
* To be called during system-wide power management transitions to sleep states
|
||||
* or during the subsequent system-wide transitions back to the working state.
|
||||
*
|
||||
* Return 'true' if the power states of devices remain under full control of the
|
||||
* kernel throughout the system-wide suspend and resume cycle in progress (that
|
||||
* is, if a device is put into a certain power state during suspend, it can be
|
||||
* expected to remain in that state during resume).
|
||||
*/
|
||||
static inline bool pm_suspend_no_platform(void)
|
||||
{
|
||||
return !!(pm_suspend_global_flags & PM_SUSPEND_FLAG_NO_PLATFORM);
|
||||
}
|
||||
|
||||
/* Suspend-to-idle state machnine. */
|
||||
enum s2idle_states {
|
||||
S2IDLE_STATE_NONE, /* Not suspended/suspending. */
|
||||
|
@ -493,6 +493,9 @@ int suspend_devices_and_enter(suspend_state_t state)
|
||||
|
||||
pm_suspend_target_state = state;
|
||||
|
||||
if (state == PM_SUSPEND_TO_IDLE)
|
||||
pm_set_suspend_no_platform();
|
||||
|
||||
error = platform_suspend_begin(state);
|
||||
if (error)
|
||||
goto Close;
|
||||
|
Loading…
Reference in New Issue
Block a user