• Imre Deak's avatar
    drm/i915: Fix system resume if PCI device remained enabled · dab9a266
    Imre Deak authored
    During system resume we depended on pci_enable_device() also putting the
    device into PCI D0 state. This won't work if the PCI device was already
    enabled but still in D3 state. This is because pci_enable_device() is
    refcounted and will not change the HW state if called with a non-zero
    refcount. Leaving the device in D3 will make all subsequent device
    accesses fail.
    
    This didn't cause a problem most of the time, since we resumed with an
    enable refcount of 0. But it fails at least after module reload because
    after that we also happen to leak a PCI device enable reference: During
    probing we call drm_get_pci_dev() which will enable the PCI device, but
    during device removal drm_put_dev() won't disable it. This is a bug of
    its own in DRM core, but without much harm as it only leaves the PCI
    device enabled. Fixing it is also a bit more involved, due to DRM
    mid-layering and because it affects non-i915 drivers too. The fix in
    this patch is valid regardless of the problem in DRM core.
    
    v2:
    - Add a code comment about the relation of this fix to the freeze/thaw
      vs. the suspend/resume phases. (Ville)
    - Add a code comment about the inconsistent ordering of set power state
      and device enable calls. (Chris)
    
    CC: Ville Syrjälä <ville.syrjala@linux.intel.com>
    CC: Chris Wilson <chris@chris-wilson.co.uk>
    CC: stable@vger.kernel.org
    Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
    Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/1460979954-14503-1-git-send-email-imre.deak@intel.com
    (cherry picked from commit 44410cd0)
    Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
    dab9a266
i915_drv.c 50.3 KB