@@ -740,19 +740,17 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void *userdata)
740
740
if (!(features & VMD_FEAT_BIOS_PM_QUIRK ))
741
741
return 0 ;
742
742
743
- pci_enable_link_state_locked (pdev , PCIE_LINK_STATE_ALL );
744
-
745
743
pos = pci_find_ext_capability (pdev , PCI_EXT_CAP_ID_LTR );
746
744
if (!pos )
747
- return 0 ;
745
+ goto out_state_change ;
748
746
749
747
/*
750
748
* Skip if the max snoop LTR is non-zero, indicating BIOS has set it
751
749
* so the LTR quirk is not needed.
752
750
*/
753
751
pci_read_config_dword (pdev , pos + PCI_LTR_MAX_SNOOP_LAT , & ltr_reg );
754
752
if (!!(ltr_reg & (PCI_LTR_VALUE_MASK | PCI_LTR_SCALE_MASK )))
755
- return 0 ;
753
+ goto out_state_change ;
756
754
757
755
/*
758
756
* 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)
764
762
pci_write_config_dword (pdev , pos + PCI_LTR_MAX_SNOOP_LAT , ltr_reg );
765
763
pci_info (pdev , "VMD: Default LTR value set by driver\n" );
766
764
765
+ out_state_change :
766
+ /*
767
+ * Ensure devices are in D0 before enabling PCI-PM L1 PM Substates, per
768
+ * PCIe r6.0, sec 5.5.4.
769
+ */
770
+ pci_set_power_state_locked (pdev , PCI_D0 );
771
+ pci_enable_link_state_locked (pdev , PCIE_LINK_STATE_ALL );
767
772
return 0 ;
768
773
}
769
774
@@ -1100,6 +1105,10 @@ static const struct pci_device_id vmd_ids[] = {
1100
1105
.driver_data = VMD_FEATS_CLIENT ,},
1101
1106
{PCI_VDEVICE (INTEL , PCI_DEVICE_ID_INTEL_VMD_9A0B ),
1102
1107
.driver_data = VMD_FEATS_CLIENT ,},
1108
+ {PCI_VDEVICE (INTEL , 0xb60b ),
1109
+ .driver_data = VMD_FEATS_CLIENT ,},
1110
+ {PCI_VDEVICE (INTEL , 0xb06f ),
1111
+ .driver_data = VMD_FEATS_CLIENT ,},
1103
1112
{0 ,}
1104
1113
};
1105
1114
MODULE_DEVICE_TABLE (pci , vmd_ids );
0 commit comments