[Intel-gfx] [PATCH] drm/i915: Don't try to use SPR_SCALE when we don't have a sprite scaler
Daniel Vetter
daniel at ffwll.ch
Tue Oct 23 16:45:33 CEST 2012
On Tue, Oct 23, 2012 at 07:16:03AM -0700, Jesse Barnes wrote:
> 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.
Queued for -next, thanks for the patch.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the Intel-gfx
mailing list