diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_frontbuffer.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_frontbuffer.c | 46 | 
1 files changed, 17 insertions, 29 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c b/drivers/gpu/drm/i915/display/intel_frontbuffer.c index 17a7aa8b28c2..22392f94b626 100644 --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c @@ -167,7 +167,7 @@ void __intel_fb_invalidate(struct intel_frontbuffer *front,  			   enum fb_op_origin origin,  			   unsigned int frontbuffer_bits)  { -	struct drm_i915_private *i915 = to_i915(front->obj->base.dev); +	struct drm_i915_private *i915 = intel_bo_to_i915(front->obj);  	if (origin == ORIGIN_CS) {  		spin_lock(&i915->display.fb_tracking.lock); @@ -188,7 +188,7 @@ void __intel_fb_flush(struct intel_frontbuffer *front,  		      enum fb_op_origin origin,  		      unsigned int frontbuffer_bits)  { -	struct drm_i915_private *i915 = to_i915(front->obj->base.dev); +	struct drm_i915_private *i915 = intel_bo_to_i915(front->obj);  	if (origin == ORIGIN_CS) {  		spin_lock(&i915->display.fb_tracking.lock); @@ -221,24 +221,18 @@ static void frontbuffer_retire(struct i915_active *ref)  }  static void frontbuffer_release(struct kref *ref) -	__releases(&to_i915(front->obj->base.dev)->display.fb_tracking.lock) +	__releases(&intel_bo_to_i915(front->obj)->display.fb_tracking.lock)  {  	struct intel_frontbuffer *front =  		container_of(ref, typeof(*front), ref);  	struct drm_i915_gem_object *obj = front->obj; -	struct i915_vma *vma; -	drm_WARN_ON(obj->base.dev, atomic_read(&front->bits)); +	drm_WARN_ON(&intel_bo_to_i915(obj)->drm, atomic_read(&front->bits)); -	spin_lock(&obj->vma.lock); -	for_each_ggtt_vma(vma, obj) { -		i915_vma_clear_scanout(vma); -		vma->display_alignment = I915_GTT_MIN_ALIGNMENT; -	} -	spin_unlock(&obj->vma.lock); +	i915_ggtt_clear_scanout(obj); -	RCU_INIT_POINTER(obj->frontbuffer, NULL); -	spin_unlock(&to_i915(obj->base.dev)->display.fb_tracking.lock); +	i915_gem_object_set_frontbuffer(obj, NULL); +	spin_unlock(&intel_bo_to_i915(obj)->display.fb_tracking.lock);  	i915_active_fini(&front->write); @@ -249,10 +243,10 @@ static void frontbuffer_release(struct kref *ref)  struct intel_frontbuffer *  intel_frontbuffer_get(struct drm_i915_gem_object *obj)  { -	struct drm_i915_private *i915 = to_i915(obj->base.dev); -	struct intel_frontbuffer *front; +	struct drm_i915_private *i915 = intel_bo_to_i915(obj); +	struct intel_frontbuffer *front, *cur; -	front = __intel_frontbuffer_get(obj); +	front = i915_gem_object_get_frontbuffer(obj);  	if (front)  		return front; @@ -269,24 +263,18 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj)  			 I915_ACTIVE_RETIRE_SLEEPS);  	spin_lock(&i915->display.fb_tracking.lock); -	if (rcu_access_pointer(obj->frontbuffer)) { -		kfree(front); -		front = rcu_dereference_protected(obj->frontbuffer, true); -		kref_get(&front->ref); -	} else { -		i915_gem_object_get(obj); -		rcu_assign_pointer(obj->frontbuffer, front); -	} +	cur = i915_gem_object_set_frontbuffer(obj, front);  	spin_unlock(&i915->display.fb_tracking.lock); - -	return front; +	if (cur != front) +		kfree(front); +	return cur;  }  void intel_frontbuffer_put(struct intel_frontbuffer *front)  {  	kref_put_lock(&front->ref,  		      frontbuffer_release, -		      &to_i915(front->obj->base.dev)->display.fb_tracking.lock); +		      &intel_bo_to_i915(front->obj)->display.fb_tracking.lock);  }  /** @@ -315,13 +303,13 @@ void intel_frontbuffer_track(struct intel_frontbuffer *old,  	BUILD_BUG_ON(I915_MAX_PLANES > INTEL_FRONTBUFFER_BITS_PER_PIPE);  	if (old) { -		drm_WARN_ON(old->obj->base.dev, +		drm_WARN_ON(&intel_bo_to_i915(old->obj)->drm,  			    !(atomic_read(&old->bits) & frontbuffer_bits));  		atomic_andnot(frontbuffer_bits, &old->bits);  	}  	if (new) { -		drm_WARN_ON(new->obj->base.dev, +		drm_WARN_ON(&intel_bo_to_i915(new->obj)->drm,  			    atomic_read(&new->bits) & frontbuffer_bits);  		atomic_or(frontbuffer_bits, &new->bits);  	} | 
