Revert "PCI/ASPM: Remove pcie_aspm_pm_state_change()"
This reverts commit08d0cc5f34
. Michael reported that when attempting to resume from suspend to RAM on ASUS mini PC PN51-BB757MDE1 (DMI model: MINIPC PN51-E1),08d0cc5f34
("PCI/ASPM: Remove pcie_aspm_pm_state_change()") caused a 12-second delay with no output, followed by a reboot. Workarounds include: - Reverting08d0cc5f34
("PCI/ASPM: Remove pcie_aspm_pm_state_change()") - Booting with "pcie_aspm=off" - Booting with "pcie_aspm.policy=performance" - "echo 0 | sudo tee /sys/bus/pci/devices/0000:03:00.0/link/l1_aspm" before suspending - Connecting a USB flash drive Link: https://lore.kernel.org/r/20240102232550.1751655-1-helgaas@kernel.org Fixes:08d0cc5f34
("PCI/ASPM: Remove pcie_aspm_pm_state_change()") Reported-by: Michael Schaller <michael@5challer.de> Link: https://lore.kernel.org/r/76c61361-b8b4-435f-a9f1-32b716763d62@5challer.de Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Cc: <stable@vger.kernel.org>
This commit is contained in:
parent
b85ea95d08
commit
f93e71aea6
3 changed files with 27 additions and 0 deletions
|
@ -1335,6 +1335,9 @@ static int pci_set_full_power_state(struct pci_dev *dev)
|
||||||
pci_restore_bars(dev);
|
pci_restore_bars(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dev->bus->self)
|
||||||
|
pcie_aspm_pm_state_change(dev->bus->self);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1429,6 +1432,9 @@ static int pci_set_low_power_state(struct pci_dev *dev, pci_power_t state)
|
||||||
pci_power_name(dev->current_state),
|
pci_power_name(dev->current_state),
|
||||||
pci_power_name(state));
|
pci_power_name(state));
|
||||||
|
|
||||||
|
if (dev->bus->self)
|
||||||
|
pcie_aspm_pm_state_change(dev->bus->self);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -569,10 +569,12 @@ int pcie_retrain_link(struct pci_dev *pdev, bool use_lt);
|
||||||
#ifdef CONFIG_PCIEASPM
|
#ifdef CONFIG_PCIEASPM
|
||||||
void pcie_aspm_init_link_state(struct pci_dev *pdev);
|
void pcie_aspm_init_link_state(struct pci_dev *pdev);
|
||||||
void pcie_aspm_exit_link_state(struct pci_dev *pdev);
|
void pcie_aspm_exit_link_state(struct pci_dev *pdev);
|
||||||
|
void pcie_aspm_pm_state_change(struct pci_dev *pdev);
|
||||||
void pcie_aspm_powersave_config_link(struct pci_dev *pdev);
|
void pcie_aspm_powersave_config_link(struct pci_dev *pdev);
|
||||||
#else
|
#else
|
||||||
static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) { }
|
static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) { }
|
||||||
static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev) { }
|
static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev) { }
|
||||||
|
static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev) { }
|
||||||
static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) { }
|
static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1008,6 +1008,25 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev)
|
||||||
up_read(&pci_bus_sem);
|
up_read(&pci_bus_sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* @pdev: the root port or switch downstream port */
|
||||||
|
void pcie_aspm_pm_state_change(struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
struct pcie_link_state *link = pdev->link_state;
|
||||||
|
|
||||||
|
if (aspm_disabled || !link)
|
||||||
|
return;
|
||||||
|
/*
|
||||||
|
* Devices changed PM state, we should recheck if latency
|
||||||
|
* meets all functions' requirement
|
||||||
|
*/
|
||||||
|
down_read(&pci_bus_sem);
|
||||||
|
mutex_lock(&aspm_lock);
|
||||||
|
pcie_update_aspm_capable(link->root);
|
||||||
|
pcie_config_aspm_path(link);
|
||||||
|
mutex_unlock(&aspm_lock);
|
||||||
|
up_read(&pci_bus_sem);
|
||||||
|
}
|
||||||
|
|
||||||
void pcie_aspm_powersave_config_link(struct pci_dev *pdev)
|
void pcie_aspm_powersave_config_link(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
struct pcie_link_state *link = pdev->link_state;
|
struct pcie_link_state *link = pdev->link_state;
|
||||||
|
|
Loading…
Add table
Reference in a new issue