diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 21 | 
1 files changed, 18 insertions, 3 deletions
| diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index b59b6d5b7583..e5b84ff89ca5 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -266,10 +266,15 @@ u32 intel_ring_get_active_head(struct intel_ring_buffer *ring)  static int init_ring_common(struct intel_ring_buffer *ring)  { -	drm_i915_private_t *dev_priv = ring->dev->dev_private; +	struct drm_device *dev = ring->dev; +	drm_i915_private_t *dev_priv = dev->dev_private;  	struct drm_i915_gem_object *obj = ring->obj; +	int ret = 0;  	u32 head; +	if (HAS_FORCE_WAKE(dev)) +		gen6_gt_force_wake_get(dev_priv); +  	/* Stop the ring if it's running. */  	I915_WRITE_CTL(ring, 0);  	I915_WRITE_HEAD(ring, 0); @@ -317,7 +322,8 @@ static int init_ring_common(struct intel_ring_buffer *ring)  				I915_READ_HEAD(ring),  				I915_READ_TAIL(ring),  				I915_READ_START(ring)); -		return -EIO; +		ret = -EIO; +		goto out;  	}  	if (!drm_core_check_feature(ring->dev, DRIVER_MODESET)) @@ -326,9 +332,14 @@ static int init_ring_common(struct intel_ring_buffer *ring)  		ring->head = I915_READ_HEAD(ring);  		ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;  		ring->space = ring_space(ring); +		ring->last_retired_head = -1;  	} -	return 0; +out: +	if (HAS_FORCE_WAKE(dev)) +		gen6_gt_force_wake_put(dev_priv); + +	return ret;  }  static int @@ -987,6 +998,10 @@ static int intel_init_ring_buffer(struct drm_device *dev,  	if (ret)  		goto err_unref; +	ret = i915_gem_object_set_to_gtt_domain(obj, true); +	if (ret) +		goto err_unpin; +  	ring->virtual_start = ioremap_wc(dev->agp->base + obj->gtt_offset,  					 ring->size);  	if (ring->virtual_start == NULL) { | 
