diff options
Diffstat (limited to 'drivers/pci/controller/vmd.c')
| -rw-r--r-- | drivers/pci/controller/vmd.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index 264a180403a0..11870d1fc818 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -740,11 +740,9 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void *userdata)  	if (!(features & VMD_FEAT_BIOS_PM_QUIRK))  		return 0; -	pci_enable_link_state_locked(pdev, PCIE_LINK_STATE_ALL); -  	pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_LTR);  	if (!pos) -		return 0; +		goto out_state_change;  	/*  	 * Skip if the max snoop LTR is non-zero, indicating BIOS has set it @@ -752,7 +750,7 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void *userdata)  	 */  	pci_read_config_dword(pdev, pos + PCI_LTR_MAX_SNOOP_LAT, <r_reg);  	if (!!(ltr_reg & (PCI_LTR_VALUE_MASK | PCI_LTR_SCALE_MASK))) -		return 0; +		goto out_state_change;  	/*  	 * Set the default values to the maximum required by the platform to @@ -764,6 +762,13 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void *userdata)  	pci_write_config_dword(pdev, pos + PCI_LTR_MAX_SNOOP_LAT, ltr_reg);  	pci_info(pdev, "VMD: Default LTR value set by driver\n"); +out_state_change: +	/* +	 * Ensure devices are in D0 before enabling PCI-PM L1 PM Substates, per +	 * PCIe r6.0, sec 5.5.4. +	 */ +	pci_set_power_state_locked(pdev, PCI_D0); +	pci_enable_link_state_locked(pdev, PCIE_LINK_STATE_ALL);  	return 0;  }  | 
