|
@@ -41,6 +41,16 @@ static inline int ring_space(struct intel_ring_buffer *ring)
|
|
|
return space;
|
|
|
}
|
|
|
|
|
|
+void __intel_ring_advance(struct intel_ring_buffer *ring)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = ring->dev->dev_private;
|
|
|
+
|
|
|
+ ring->tail &= ring->size - 1;
|
|
|
+ if (dev_priv->gpu_error.stop_rings & intel_ring_flag(ring))
|
|
|
+ return;
|
|
|
+ ring->write_tail(ring, ring->tail);
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
gen2_render_ring_flush(struct intel_ring_buffer *ring,
|
|
|
u32 invalidate_domains,
|
|
@@ -631,7 +641,7 @@ gen6_add_request(struct intel_ring_buffer *ring)
|
|
|
intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
|
|
|
intel_ring_emit(ring, ring->outstanding_lazy_seqno);
|
|
|
intel_ring_emit(ring, MI_USER_INTERRUPT);
|
|
|
- intel_ring_advance(ring);
|
|
|
+ __intel_ring_advance(ring);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -744,7 +754,7 @@ pc_render_add_request(struct intel_ring_buffer *ring)
|
|
|
intel_ring_emit(ring, ring->scratch.gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
|
|
|
intel_ring_emit(ring, ring->outstanding_lazy_seqno);
|
|
|
intel_ring_emit(ring, 0);
|
|
|
- intel_ring_advance(ring);
|
|
|
+ __intel_ring_advance(ring);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -965,7 +975,7 @@ i9xx_add_request(struct intel_ring_buffer *ring)
|
|
|
intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
|
|
|
intel_ring_emit(ring, ring->outstanding_lazy_seqno);
|
|
|
intel_ring_emit(ring, MI_USER_INTERRUPT);
|
|
|
- intel_ring_advance(ring);
|
|
|
+ __intel_ring_advance(ring);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1414,6 +1424,9 @@ static int ring_wait_for_space(struct intel_ring_buffer *ring, int n)
|
|
|
if (ret != -ENOSPC)
|
|
|
return ret;
|
|
|
|
|
|
+ /* force the tail write in case we have been skipping them */
|
|
|
+ __intel_ring_advance(ring);
|
|
|
+
|
|
|
trace_i915_ring_wait_begin(ring);
|
|
|
/* With GEM the hangcheck timer should kick us out of the loop,
|
|
|
* leaving it early runs the risk of corrupting GEM state (due
|
|
@@ -1568,17 +1581,6 @@ void intel_ring_init_seqno(struct intel_ring_buffer *ring, u32 seqno)
|
|
|
ring->hangcheck.seqno = seqno;
|
|
|
}
|
|
|
|
|
|
-void intel_ring_advance(struct intel_ring_buffer *ring)
|
|
|
-{
|
|
|
- struct drm_i915_private *dev_priv = ring->dev->dev_private;
|
|
|
-
|
|
|
- ring->tail &= ring->size - 1;
|
|
|
- if (dev_priv->gpu_error.stop_rings & intel_ring_flag(ring))
|
|
|
- return;
|
|
|
- ring->write_tail(ring, ring->tail);
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring,
|
|
|
u32 value)
|
|
|
{
|