• Imre Deak's avatar
    drm/i915: add support for checking if we hold an RPM reference · 1f814dac
    Imre Deak authored
    Atm, we assert that the device is not suspended until the point when the
    device is truly put to a suspended state. This is fine, but we can catch
    more problems if we check that RPM refcount is non-zero. After that one
    drops to zero we shouldn't access the device any more, even if the actual
    device suspend may be delayed. Change assert_rpm_wakelock_held()
    accordingly to check for a non-zero RPM refcount in addition to the
    current device-not-suspended check.
    
    For the new asserts to work we need to annotate every place explicitly in
    the code where we expect that the device is powered. The places where we
    only assume this, but may not hold an RPM reference:
    - driver load
      We assume the device to be powered until we enable RPM. Make this
      explicit by taking an RPM reference around the load function.
    - system and runtime sudpend/resume handlers
      These handlers are called when the RPM reference becomes 0 and know the
      exact point after which the device can get powered off. Disable the
      RPM-reference-held check for their duration.
    - the IRQ, hangcheck and RPS work handlers
      These handlers are flushed in the system/runtime suspend handler
      before the device is powered off, so it's guaranteed that they won't
      run while the device is powered off even though they don't hold any
      RPM reference. Disable the RPM-reference-held check for their duration.
    
    In all these cases we still check that the device is not suspended.
    These explicit annotations also have the positive side effect of
    documenting our assumptions better.
    
    This caught additional WARNs from the atomic modeset path, those should
    be fixed separately.
    
    v2:
    - remove the redundant HAS_RUNTIME_PM check (moved to patch 1) (Ville)
    v3:
    - use a new dedicated RPM wakelock refcount to also catch cases where
      our own RPM get/put functions were not called (Chris)
    - assert also that the new RPM wakelock refcount is 0 in the RPM
      suspend handler (Chris)
    - change the assert error message to be more meaningful (Chris)
    - prevent false assert errors and check that the RPM wakelock is 0 in
      the RPM resume handler too
    - prevent false assert errors in the hangcheck work too
    - add a device not suspended assert check to the hangcheck work
    v4:
    - rename disable/enable_rpm_asserts to disable/enable_rpm_wakeref_asserts
      and wakelock_count to wakeref_count
    - disable the wakeref asserts in the IRQ handlers and RPS work too
    - update/clarify commit message
    v5:
    - mark places we plan to change to use proper RPM refcounting with
      separate DISABLE/ENABLE_RPM_WAKEREF_ASSERTS aliases (Chris)
    Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
    Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Link: http://patchwork.freedesktop.org/patch/msgid/1450227139-13471-1-git-send-email-imre.deak@intel.com
    1f814dac
intel_pm.c 204 KB