[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