• Imre Deak's avatar
    drm/i915: sanitize rps irq disabling · d4d70aa5
    Imre Deak authored
    When disabling the RPS interrupts there is a tricky dependency between
    the thread disabling the interrupts, the RPS interrupt handler and the
    corresponding RPS work. The RPS work can reenable the interrupts, so
    there is no straightforward order in the disabling thread to (1) make
    sure that any RPS work is flushed and to (2) disable all RPS
    interrupts. Currently this is solved by masking the interrupts using two
    separate mask registers (first level display IMR and PM IMR) and doing
    the disabling when all first level interrupts are disabled.
    
    This works, but the requirement to run with all first level interrupts
    disabled is unnecessary making the suspend / unload time ordering of RPS
    disabling wrt. other unitialization steps difficult and error prone.
    Removing this restriction allows us to disable RPS early during suspend
    / unload and forget about it for the rest of the sequence. By adding a
    more explicit method for avoiding the above race, it also becomes easier
    to prove its correctness. Finally currently we can hit the WARN in
    snb_update_pm_irq(), when a final RPS work runs with the first level
    interrupts already disabled. This won't lead to any problem (due to the
    separate interrupt masks), but with the change in this and the next
    patch we can get rid of the WARN, while leaving it in place for other
    scenarios.
    
    To address the above points, add a new RPS interrupts_enabled flag and
    use this during RPS disabling to avoid requeuing the RPS work and
    reenabling of the RPS interrupts. Since the interrupt disabling happens
    now in intel_suspend_gt_powersave(), we will disable RPS interrupts
    explicitly during suspend (and not just through the first level mask),
    but there is no problem doing so, it's also more consistent and allows
    us to unify more of the RPS disabling during suspend and unload time in
    the next patch.
    
    v2/v3:
    - rebase on patch "drm/i915: move rps irq disable one level up" in the
      patchset
    Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
    Reviewed-by: default avatarPaulo Zanoni <paulo.r.zanoni@intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    d4d70aa5
i915_irq.c 127 KB