• M
    PCI / PM: Do not clear state_saved in pci_pm_freeze() when smart suspend is set · ae860a19
    Mika Westerberg 提交于
    If a driver uses DPM_FLAG_SMART_SUSPEND and the device is already
    runtime suspended when hibernate is started PCI core skips runtime
    resuming the device but still clears pci_dev->state_saved. After the
    hibernation image is written pci_pm_thaw_noirq() makes sure subsequent
    thaw phases for the device are also skipped leaving it runtime suspended
    with pci_dev->state_saved == false.
    
    When the device is eventually runtime resumed pci_pm_runtime_resume()
    restores config space by calling pci_restore_standard_config(), however
    because pci_dev->state_saved == false pci_restore_state() never actually
    restores the config space leaving the device in a state that is not what
    the driver might expect.
    
    For example here is what happens for intel-lpss I2C devices once the
    hibernation snapshot is taken:
    
      intel-lpss 0000:00:15.0: power state changed by ACPI to D0
      intel-lpss 0000:00:1e.0: power state changed by ACPI to D3cold
      video LNXVIDEO:00: Restoring backlight state
      PM: hibernation exit
      i2c_designware i2c_designware.1: Unknown Synopsys component type: 0xffffffff
      i2c_designware i2c_designware.0: Unknown Synopsys component type: 0xffffffff
      i2c_designware i2c_designware.1: timeout in disabling adapter
      i2c_designware i2c_designware.0: timeout in disabling adapter
    
    Since PCI config space is not restored the device is still in D3hot
    making MMIO register reads return 0xffffffff.
    
    Fix this by clearing pci_dev->state_saved only if we actually end up
    runtime resuming the device.
    
    Fixes: c4b65157 (PCI / PM: Take SMART_SUSPEND driver flag into account)
    Signed-off-by: NMika Westerberg <mika.westerberg@linux.intel.com>
    Cc: 4.15+ <stable@vger.kernel.org> # 4.15+
    Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
    ae860a19
pci-driver.c 40.4 KB