• Daniel Vetter's avatar
    drm/i915: fix up semaphore_waits_for · 88fe429d
    Daniel Vetter authored
    There's an entire pile of issues in here:
    
    - Use the main RING_HEAD register, not ACTHD. ACTHD points at the gtt
      offset of the batch buffer when a batch is executed. Semaphores are
      always emitted to the main ring, so we always want to look at that.
    
    - Mask the obtained HEAD pointer with the actual ring size, which is
      much smaller. Together with the above issue this resulted us in
      trying to dereference a pointer way outside of the ring mmio
      mapping. The resulting invalid access in interrupt context
      (hangcheck is executed from timers) lead to a full blown kernel
      panic. The fbcon panic handler then tried to frob our driver harder,
      resulting in a full machine hang at least on my snb here where I've
      stumbled over this.
    
    - Handle ring wrapping correctly and be a bit more explicit about how
      many dwords we're scanning. We probably should also scan more than
      just 4 ...
    
    - Space out some of teh computations for readability.
    
    This reduces hard-hangs on my snb here. Mika and QA both say that it
    doesn't completel remove them, but at least for me it's a clear
    improvement in stability.
    
    Cc: Mika Kuoppala <mika.kuoppala@intel.com>
    Cc: Ben Widawsky <ben@bwidawsk.net>
    Cc: Chris Wilson <chris@chris-wilson.co.uk>
    References: https://bugs.freedesktop.org/show_bug.cgi?id=74100Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    88fe429d
i915_irq.c 119 KB