<div class="gmail_quote">On Wed, Jan 4, 2012 at 14:52, Daniel Vetter <span dir="ltr"><<a href="mailto:daniel.vetter@ffwll.ch">daniel.vetter@ffwll.ch</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Two things seem to do the trick on my ivb machine here:<br>
- prevent the gt from powering down while waiting for seqno<br>
  notification interrupts by grabbing the force_wake in get_irq (and<br>
  dropping it in put_irq again).<br>
- ordering writes from the ring's CS by reading a CS register, ACTHD<br>
  seems to work.<br>
<br>
Only the blt&bsd ring on ivb seem to be massively affected by this,<br>
but for paranoia do this dance also on the render ring and on snb<br>
(i.e. all gpus with forcewake).<br>
<br>
Tested with Eric's glCopyPixels loop which without this patch scores a<br>
missed irq every few seconds.<br>
<br>
This patch needs my forcewake rework to use a spinlock instead of<br>
dev->struct_mutex.<br>
<br>
Cc: <a href="mailto:stable@kernel.org">stable@kernel.org</a><br>
Cc: Eric Anholt <<a href="mailto:eric@anholt.net">eric@anholt.net</a>><br>
Cc: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
Cc: Eugeni Dodonov <<a href="mailto:eugeni.dodonov@intel.com">eugeni.dodonov@intel.com</a>><br>
Signed-Off-by: Daniel Vetter <<a href="mailto:daniel.vetter@ffwll.ch">daniel.vetter@ffwll.ch</a>><br></blockquote><div><br>This voodoo magic works here, no more missed irqs on my IVBs.<br>Tested-by: Eugeni Dodonov <<a href="mailto:eugeni.dodonov@intel.com">eugeni.dodonov@intel.com</a>><br>

Reviewed-by: Eugeni Dodonov <<a href="mailto:eugeni.dodonov@intel.com">eugeni.dodonov@intel.com</a>><br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

 static u32<br>
+gen6_ring_get_seqno(struct intel_ring_buffer *ring)<br>
+{<br>
+       /* Workaround for force correct ordering between irq and seqno writes on<br>
+        * ivb (and maybe also on snb). */<br>
+       intel_ring_get_active_head(ring);<br>
+       return intel_read_status_page(ring, I915_GEM_HWS_INDEX);<br></blockquote><div><br><bikeshedding><br> - the comment could be rewritten to "Workaround for force correct ordering between irq and seqno writes on ivb (and maybe also on snb) by reading a CS register, like ACTHD, prior reading status page".<br>

 - we could do a 'return ring_get_seqno(ring);' instead of 'return intel_read_status_page(ring, I915_GEM_HWS_INDEX);' to reduce the Universe entropy :). <br clear="all"></div></div></bikeshedding><br>

<br>-- <br>Eugeni Dodonov<a href="http://eugeni.dodonov.net/" target="_blank"><br></a><br>