[Intel-gfx] [PATCH] i915: Restore fence registers on resume

Stefano Avallone stavallo at unina.it
Tue May 5 15:18:28 CEST 2009


On Monday 04 May 2009 22:07:04 Eric Anholt wrote:
> On Mon, 2009-05-04 at 15:59 -0400, Kristian Høgsberg wrote:
> > From: Kristian Høgsberg <krh at redhat.com>
> >
> > Buffers that stay pinned during suspend/resume need to have their
> > fence registers rewritten when we come back from resume.
> >
> > Signed-off-by: Kristian Høgsberg <krh at redhat.com>
>
> I'd already pulled one for this from keithp.

Hmm, maybe it's just me, but I can't find this patch in the drm-intel-next 
branch of your kernel repository. Can you please tell where it has been 
applied?

thanks,
Stefano


> commit 79f11c19a396e8cea7dad322dcfb46c0a8517fe6
> Author: Keith Packard <keithp at keithp.com>
> Date:   Thu Apr 30 14:43:44 2009 -0700
>
>     drm/i915: save/restore fence registers across suspend/resume
>
>     This makes software fallbacks not do tiling wrong on i965 and later
> after resume. It also should fix 945 performance reduction after resume
> which would have disabled tiling without causing any visible effect.
>
>     Signed-off-by: Keith Packard <keithp at keithp.com>
>     [anholt: Fixed up the 915 case to not save/restore the new regs]
>     Signed-off-by: Eric Anholt <eric at anholt.net>
>
> > ---
> >  drivers/gpu/drm/i915/i915_drv.c |    2 ++
> >  drivers/gpu/drm/i915/i915_drv.h |    1 +
> >  drivers/gpu/drm/i915/i915_gem.c |   26 ++++++++++++++++++++++++++
> >  3 files changed, 29 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_drv.c
> > b/drivers/gpu/drm/i915/i915_drv.c index b293ef0..a77d7f1 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.c
> > +++ b/drivers/gpu/drm/i915/i915_drv.c
> > @@ -111,6 +111,8 @@ static int i915_resume(struct drm_device *dev)
> >  			ret = -1;
> >  		mutex_unlock(&dev->struct_mutex);
> >
> > +		i915_gem_restore_fences(dev);
> > +
> >  		drm_irq_install(dev);
> >  	}
> >
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h
> > b/drivers/gpu/drm/i915/i915_drv.h index d6cc986..2c9faa7 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -632,6 +632,7 @@ int i915_gem_attach_phys_object(struct drm_device
> > *dev, void i915_gem_detach_phys_object(struct drm_device *dev,
> >  				 struct drm_gem_object *obj);
> >  void i915_gem_free_all_phys_object(struct drm_device *dev);
> > +int i915_gem_restore_fences(struct drm_device *dev);
> >
> >  /* i915_gem_tiling.c */
> >  void i915_gem_detect_bit_6_swizzle(struct drm_device *dev);
> > diff --git a/drivers/gpu/drm/i915/i915_gem.c
> > b/drivers/gpu/drm/i915/i915_gem.c index fb6390a..2b36a32 100644
> > --- a/drivers/gpu/drm/i915/i915_gem.c
> > +++ b/drivers/gpu/drm/i915/i915_gem.c
> > @@ -1708,6 +1708,32 @@ i915_gem_clear_fence_reg(struct drm_gem_object
> > *obj) obj_priv->fence_reg = I915_FENCE_REG_NONE;
> >  }
> >
> > +int
> > +i915_gem_restore_fences(struct drm_device *dev)
> > +{
> > +	drm_i915_private_t *dev_priv = dev->dev_private;
> > +	struct drm_i915_fence_reg *reg;
> > +	int i, count, ret = 0;
> > +
> > +	for (i = dev_priv->fence_reg_start;
> > +	     i < dev_priv->num_fence_regs; i++) {
> > +		reg = &dev_priv->fence_regs[i];
> > +		if (!reg->obj)
> > +			continue;
> > +
> > +		count++;
> > +		if (IS_I965G(dev))
> > +			i965_write_fence_reg(reg);
> > +		else if (IS_I9XX(dev))
> > +			i915_write_fence_reg(reg);
> > +		else
> > +			i830_write_fence_reg(reg);
> > +	}
> > +
> > +	if (count > 0)
> > +		DRM_DEBUG("restored %d fence regs\n", count);
> > +}
> > +
> >  /**
> >   * Finds free space in the GTT aperture and binds the object there.
> >   */




More information about the Intel-gfx mailing list