• Daniel Vetter's avatar
    drm/i915: unify GT/PM irq postinstall code · 0a9a8c91
    Daniel Vetter authored
    Again extract a common helper. For the postinstall hook things are a
    bit more complicated since we have more cases on ilk-hsw/vlv here.
    
    But since vlv was clearly broken by failing to initialize
    dev_priv->gt_irq_mask correctly the shared code is clearly justified.
    
    Also kill the PMIER setting in the async rps enable work. I should
    have been save, but also clearly looked rather fragile. PMIER setup is
    now all down in the irq pre/postinstall hooks.
    
    With this we now have the usual interrupt register sequence for GT/PM
    irq registers:
    
    - IER is setup once with all the interrupts we ever need in the
      postinstall hook and never touched again. Exceptions are SDEIER,
      which is touched in the preinstall hook (when the irq handler isn't
      enabled) and then only from the irq handler. And DEIER/VLV_IER with
      is used in the irq handler but also written to once in the
      postinstall hook. But since that write is essentially what enables
      the interrupt and we should always have MSI interrupts we should be
      save. In case we ever have non-MSI interrupts we'd be screwed.
    
    - IIR is cleared in the postinstall hook before we enable/unmask the
      respective interrupt sources. Hence we can't steal an interrupt
      event an accidentally trigger the spurious interrupt logic in the
      core kernel. Note that after some discussion with Ben Widawsky we
      think that we actually should clear the IIR registers in the
      preinstall hook. But doing that is a much larger patch series.
    
    - IMR regs are (usually) all masked off. Those are the only regs
      changed at runtime, which is all protected by dev_priv->irq_lock.
    
    This unification also kills the cargo-culted read-modify-write PM
    register setup for VECS. Interrupt setup is done without userspace
    being able to interfere, so we better know what values we want to put
    into those registers. RMW cycles otoh are really good at papering over
    races, until stuff magically blows up and no one has a clue why.
    
    v2: Touch the gen6+ PM interrupt registers only on gen6+.
    
    v3: Improve the commit message to more clearly spell out why we want
    to unify the code and what exactly changes.
    
    Cc: Ben Widawsky <ben@bwidawsk.net>
    Cc: Paulo Zanoni <przanoni@gmail.com>
    Reviewed-by: default avatarBen Widawsky <ben@bwidawsk.net>
    [danvet: Add a comment to explain why the l3 parity interrupt is
    special.]
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    0a9a8c91
i915_irq.c 90.8 KB