mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	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
	
	 Bjorn Helgaas
						Bjorn Helgaas