[Intel-gfx] [PATCH 1/2] drm/i915: Save/restore cursor state on suspend/resume.

Jesse Barnes jbarnes at virtuousgeek.org
Thu Jun 4 12:17:18 CEST 2009


On Wed,  3 Jun 2009 11:39:49 +0000
Eric Anholt <eric at anholt.net> wrote:

> This may fix cursor corruption in X on resume, which would persist
> until the cursor was hidden and then shown again.
> ---
>  drivers/gpu/drm/i915/i915_drv.h     |    6 ++++++
>  drivers/gpu/drm/i915/i915_suspend.c |   16 ++++++++++++++++
>  2 files changed, 22 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h
> b/drivers/gpu/drm/i915/i915_drv.h index c431fa5..cd76a31 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -285,6 +285,11 @@ typedef struct drm_i915_private {
>  	u8 saveDACMASK;
>  	u8 saveCR[37];
>  	uint64_t saveFENCE[16];
> +	u32 saveCURAPOS;
> +	u32 saveCURABASE;
> +	u32 saveCURBPOS;
> +	u32 saveCURBBASE;
> +	u32 saveCURSIZE;
>  
>  	struct {
>  		struct drm_mm gtt_space;
> @@ -642,6 +647,7 @@ void i915_gem_detach_phys_object(struct
> drm_device *dev, void i915_gem_free_all_phys_object(struct drm_device
> *dev); int i915_gem_object_get_pages(struct drm_gem_object *obj);
>  void i915_gem_object_put_pages(struct drm_gem_object *obj);
> +void i915_gem_release(struct drm_device * dev, struct drm_file
> *file_priv); 
>  /* i915_gem_tiling.c */
>  void i915_gem_detect_bit_6_swizzle(struct drm_device *dev);
> diff --git a/drivers/gpu/drm/i915/i915_suspend.c
> b/drivers/gpu/drm/i915/i915_suspend.c index ce8a213..4c1d4cd 100644
> --- a/drivers/gpu/drm/i915/i915_suspend.c
> +++ b/drivers/gpu/drm/i915/i915_suspend.c
> @@ -295,6 +295,14 @@ int i915_save_state(struct drm_device *dev)
>  	i915_save_palette(dev, PIPE_B);
>  	dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT);
>  
> +	/* Cursor state */
> +	dev_priv->saveCURAPOS = I915_READ(CURAPOS);
> +	dev_priv->saveCURABASE = I915_READ(CURABASE);
> +	dev_priv->saveCURBPOS = I915_READ(CURBPOS);
> +	dev_priv->saveCURBBASE = I915_READ(CURBBASE);
> +	if (!IS_I9XX(dev))
> +		dev_priv->saveCURSIZE = I915_READ(CURSIZE);
> +
>  	/* CRT state */
>  	dev_priv->saveADPA = I915_READ(ADPA);
>  
> @@ -480,6 +488,14 @@ int i915_restore_state(struct drm_device *dev)
>  	I915_WRITE(DSPBCNTR, dev_priv->saveDSPBCNTR);
>  	I915_WRITE(DSPBADDR, I915_READ(DSPBADDR));
>  
> +	/* Cursor state */
> +	I915_WRITE(CURAPOS, dev_priv->saveCURAPOS);
> +	I915_WRITE(CURABASE, dev_priv->saveCURABASE);
> +	I915_WRITE(CURBPOS, dev_priv->saveCURBPOS);
> +	I915_WRITE(CURBBASE, dev_priv->saveCURBBASE);
> +	if (!IS_I9XX(dev))
> +		I915_WRITE(CURSIZE, dev_priv->saveCURSIZE);
> +
>  	/* CRT state */
>  	I915_WRITE(ADPA, dev_priv->saveADPA);
>  

We'll probably want the cursor control regs too, in the case where a VT
switch doesn't happen at suspend/resume time.

Jesse



More information about the Intel-gfx mailing list