i915: Track progress inside of batchbuffers for determining wedgedness.
This avoids early termination for long-running commands. Signed-off-by: Eric Anholt <eric@anholt.net> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
		
							parent
							
								
									ed4cb4142b
								
							
						
					
					
						commit
						d3a6d4467c
					
				| @ -40,11 +40,15 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller) | ||||
| { | ||||
| 	drm_i915_private_t *dev_priv = dev->dev_private; | ||||
| 	drm_i915_ring_buffer_t *ring = &(dev_priv->ring); | ||||
| 	u32 acthd_reg = IS_I965G(dev) ? ACTHD_I965 : ACTHD; | ||||
| 	u32 last_acthd = I915_READ(acthd_reg); | ||||
| 	u32 acthd; | ||||
| 	u32 last_head = I915_READ(PRB0_HEAD) & HEAD_ADDR; | ||||
| 	int i; | ||||
| 
 | ||||
| 	for (i = 0; i < 10000; i++) { | ||||
| 	for (i = 0; i < 100000; i++) { | ||||
| 		ring->head = I915_READ(PRB0_HEAD) & HEAD_ADDR; | ||||
| 		acthd = I915_READ(acthd_reg); | ||||
| 		ring->space = ring->head - (ring->tail + 8); | ||||
| 		if (ring->space < 0) | ||||
| 			ring->space += ring->Size; | ||||
| @ -55,8 +59,13 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller) | ||||
| 
 | ||||
| 		if (ring->head != last_head) | ||||
| 			i = 0; | ||||
| 		if (acthd != last_acthd) | ||||
| 			i = 0; | ||||
| 
 | ||||
| 		last_head = ring->head; | ||||
| 		last_acthd = acthd; | ||||
| 		msleep_interruptible(10); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	return -EBUSY; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user