diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sprite.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sprite.c | 36 | 
1 files changed, 22 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index 9a17b4e92ef4..168c6652cda1 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c @@ -218,7 +218,8 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_crtc *crtc,  	sprctl |= SP_ENABLE; -	intel_update_sprite_watermarks(dplane, crtc, src_w, pixel_size, true, +	intel_update_sprite_watermarks(dplane, crtc, src_w, src_h, +				       pixel_size, true,  				       src_w != crtc_w || src_h != crtc_h);  	/* Sizes are 0 based */ @@ -283,7 +284,7 @@ vlv_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc)  	if (atomic_update)  		intel_pipe_update_end(intel_crtc, start_vbl_count); -	intel_update_sprite_watermarks(dplane, crtc, 0, 0, false, false); +	intel_update_sprite_watermarks(dplane, crtc, 0, 0, 0, false, false);  }  static int @@ -406,7 +407,8 @@ ivb_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,  	if (IS_HASWELL(dev) || IS_BROADWELL(dev))  		sprctl |= SPRITE_PIPE_CSC_ENABLE; -	intel_update_sprite_watermarks(plane, crtc, src_w, pixel_size, true, +	intel_update_sprite_watermarks(plane, crtc, src_w, src_h, pixel_size, +				       true,  				       src_w != crtc_w || src_h != crtc_h);  	/* Sizes are 0 based */ @@ -486,7 +488,7 @@ ivb_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc)  	 */  	intel_wait_for_vblank(dev, pipe); -	intel_update_sprite_watermarks(plane, crtc, 0, 0, false, false); +	intel_update_sprite_watermarks(plane, crtc, 0, 0, 0, false, false);  }  static int @@ -606,7 +608,8 @@ ilk_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,  		dvscntr |= DVS_TRICKLE_FEED_DISABLE; /* must disable */  	dvscntr |= DVS_ENABLE; -	intel_update_sprite_watermarks(plane, crtc, src_w, pixel_size, true, +	intel_update_sprite_watermarks(plane, crtc, src_w, src_h, +				       pixel_size, true,  				       src_w != crtc_w || src_h != crtc_h);  	/* Sizes are 0 based */ @@ -681,7 +684,7 @@ ilk_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc)  	 */  	intel_wait_for_vblank(dev, pipe); -	intel_update_sprite_watermarks(plane, crtc, 0, 0, false, false); +	intel_update_sprite_watermarks(plane, crtc, 0, 0, 0, false, false);  }  static void @@ -819,6 +822,7 @@ intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,  	struct drm_device *dev = plane->dev;  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);  	struct intel_plane *intel_plane = to_intel_plane(plane); +	enum pipe pipe = intel_crtc->pipe;  	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);  	struct drm_i915_gem_object *obj = intel_fb->obj;  	struct drm_i915_gem_object *old_obj = intel_plane->obj; @@ -1006,6 +1010,8 @@ intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,  	 */  	ret = intel_pin_and_fence_fb_obj(dev, obj, NULL); +	i915_gem_track_fb(old_obj, obj, +			  INTEL_FRONTBUFFER_SPRITE(pipe));  	mutex_unlock(&dev->struct_mutex);  	if (ret) @@ -1039,6 +1045,8 @@ intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,  		else  			intel_plane->disable_plane(plane, crtc); +		intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_SPRITE(pipe)); +  		if (!primary_was_enabled && primary_enabled)  			intel_post_enable_primary(crtc);  	} @@ -1068,6 +1076,7 @@ intel_disable_plane(struct drm_plane *plane)  	struct drm_device *dev = plane->dev;  	struct intel_plane *intel_plane = to_intel_plane(plane);  	struct intel_crtc *intel_crtc; +	enum pipe pipe;  	if (!plane->fb)  		return 0; @@ -1076,6 +1085,7 @@ intel_disable_plane(struct drm_plane *plane)  		return -EINVAL;  	intel_crtc = to_intel_crtc(plane->crtc); +	pipe = intel_crtc->pipe;  	if (intel_crtc->active) {  		bool primary_was_enabled = intel_crtc->primary_enabled; @@ -1094,6 +1104,8 @@ intel_disable_plane(struct drm_plane *plane)  		mutex_lock(&dev->struct_mutex);  		intel_unpin_fb_obj(intel_plane->obj); +		i915_gem_track_fb(intel_plane->obj, NULL, +				  INTEL_FRONTBUFFER_SPRITE(pipe));  		mutex_unlock(&dev->struct_mutex);  		intel_plane->obj = NULL; @@ -1114,7 +1126,6 @@ int intel_sprite_set_colorkey(struct drm_device *dev, void *data,  			      struct drm_file *file_priv)  {  	struct drm_intel_sprite_colorkey *set = data; -	struct drm_mode_object *obj;  	struct drm_plane *plane;  	struct intel_plane *intel_plane;  	int ret = 0; @@ -1128,13 +1139,12 @@ int intel_sprite_set_colorkey(struct drm_device *dev, void *data,  	drm_modeset_lock_all(dev); -	obj = drm_mode_object_find(dev, set->plane_id, DRM_MODE_OBJECT_PLANE); -	if (!obj) { +	plane = drm_plane_find(dev, set->plane_id); +	if (!plane) {  		ret = -ENOENT;  		goto out_unlock;  	} -	plane = obj_to_plane(obj);  	intel_plane = to_intel_plane(plane);  	ret = intel_plane->update_colorkey(plane, set); @@ -1147,7 +1157,6 @@ int intel_sprite_get_colorkey(struct drm_device *dev, void *data,  			      struct drm_file *file_priv)  {  	struct drm_intel_sprite_colorkey *get = data; -	struct drm_mode_object *obj;  	struct drm_plane *plane;  	struct intel_plane *intel_plane;  	int ret = 0; @@ -1157,13 +1166,12 @@ int intel_sprite_get_colorkey(struct drm_device *dev, void *data,  	drm_modeset_lock_all(dev); -	obj = drm_mode_object_find(dev, get->plane_id, DRM_MODE_OBJECT_PLANE); -	if (!obj) { +	plane = drm_plane_find(dev, get->plane_id); +	if (!plane) {  		ret = -ENOENT;  		goto out_unlock;  	} -	plane = obj_to_plane(obj);  	intel_plane = to_intel_plane(plane);  	intel_plane->get_colorkey(plane, get);  |