[Intel-gfx] [PATCH] drm/i915: Don't try to use SPR_SCALE when we don't have a sprite scaler

Jesse Barnes jbarnes at virtuousgeek.org
Tue Oct 23 16:16:03 CEST 2012


On Mon, 22 Oct 2012 18:19:27 +0100
Damien Lespiau <damien.lespiau at gmail.com> wrote:

> From: Damien Lespiau <damien.lespiau at intel.com>
> 
> Haswell does not have a scaler in the sprite pipeline anymore, so let's
> ensure:
>   1/ We bail out of update_plate() when someone is trying to ask to
>      display a scaled framebuffer,
>   2/ We never write to the nonexistent SPR_SCALE register
> 
> Signed-off-by: Damien Lespiau <damien.lespiau at intel.com>
> ---
>  drivers/gpu/drm/i915/intel_drv.h    |  1 +
>  drivers/gpu/drm/i915/intel_sprite.c | 14 +++++++++++++-
>  2 files changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 0942fb4..97c714d 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -221,6 +221,7 @@ struct intel_plane {
>  	struct drm_plane base;
>  	enum pipe pipe;
>  	struct drm_i915_gem_object *obj;
> +	bool can_scale;
>  	int max_downscale;
>  	u32 lut_r[1024], lut_g[1024], lut_b[1024];
>  	void (*update_plane)(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
> index f2ca943..ccfaa6f 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -136,7 +136,8 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
>  		I915_WRITE(SPRLINOFF(pipe), offset);
>  	}
>  	I915_WRITE(SPRSIZE(pipe), (crtc_h << 16) | crtc_w);
> -	I915_WRITE(SPRSCALE(pipe), sprscale);
> +	if (intel_plane->can_scale)
> +		I915_WRITE(SPRSCALE(pipe), sprscale);
>  	I915_WRITE(SPRCTL(pipe), sprctl);
>  	I915_MODIFY_DISPBASE(SPRSURF(pipe), obj->gtt_offset);
>  	POSTING_READ(SPRSURF(pipe));
> @@ -474,6 +475,12 @@ intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
>  		goto out;
>  
>  	/*
> +	 * We may not have a scaler, eg. HSW does not have it any more
> +	 */
> +	if (!intel_plane->can_scale && (crtc_w != src_w || crtc_h != src_h))
> +		return -EINVAL;
> +
> +	/*
>  	 * We can take a larger source and scale it down, but
>  	 * only so much...  16x is the max on SNB.
>  	 */
> @@ -666,6 +673,7 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe)
>  	switch (INTEL_INFO(dev)->gen) {
>  	case 5:
>  	case 6:
> +		intel_plane->can_scale = true;
>  		intel_plane->max_downscale = 16;
>  		intel_plane->update_plane = ilk_update_plane;
>  		intel_plane->disable_plane = ilk_disable_plane;
> @@ -682,6 +690,10 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe)
>  		break;
>  
>  	case 7:
> +		if (IS_HASWELL(dev))
> +			intel_plane->can_scale = false;
> +		else
> +			intel_plane->can_scale = true;
>  		intel_plane->max_downscale = 2;
>  		intel_plane->update_plane = ivb_update_plane;
>  		intel_plane->disable_plane = ivb_disable_plane;

Yeah, looks fine.

Thanks,
-- 
Jesse Barnes, Intel Open Source Technology Center



More information about the Intel-gfx mailing list